From f6f2064455ae3867e92e1a45a1cdcfc7c86d2dae Mon Sep 17 00:00:00 2001 From: "iap10@labyrinth.cl.cam.ac.uk" Date: Fri, 28 Jan 2005 22:30:30 +0000 Subject: [PATCH] bitkeeper revision 1.1159.212.53 (41fabd0652DGdYKsgWToGTyAOUlZKg) Fix the direction flag for string I/O instructions -- missing hunk from earlier patch Signed-off-by: Jun Nakajima Signed-off-by: Chengyuan Li Signed-off-by: ian.pratt@cl.cam.ac.uk --- tools/ioemu/iodev/cpu.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tools/ioemu/iodev/cpu.cc b/tools/ioemu/iodev/cpu.cc index 3e82e7f2c5..5d8c09a342 100644 --- a/tools/ioemu/iodev/cpu.cc +++ b/tools/ioemu/iodev/cpu.cc @@ -83,6 +83,9 @@ ioreq_t* bx_cpu_c::get_ioreq(void) void bx_cpu_c::dispatch_ioreq(ioreq_t *req) { int ret, i; + int sign; + + sign = (req->df) ? -1 : 1; if ((!req->pdata_valid) && (req->dir == IOREQ_WRITE)) { if (req->size != 4) { @@ -99,7 +102,7 @@ void bx_cpu_c::dispatch_ioreq(ioreq_t *req) for (i = 0; i < req->count; i++) { tmp = BX_INP(req->addr, req->size); - BX_MEM_WRITE_PHYSICAL((Bit32u) req->u.pdata + (i * req->size), + BX_MEM_WRITE_PHYSICAL((Bit32u) req->u.pdata + (sign * i * req->size), req->size, &tmp); } } @@ -110,7 +113,7 @@ void bx_cpu_c::dispatch_ioreq(ioreq_t *req) for (i = 0; i < req->count; i++) { unsigned long tmp; - BX_MEM_READ_PHYSICAL((Bit32u) req->u.pdata + (i * req->size), req->size, + BX_MEM_READ_PHYSICAL((Bit32u) req->u.pdata + (sign * i * req->size), req->size, &tmp); BX_OUTP(req->addr, (Bit32u) tmp, req->size); } @@ -129,14 +132,14 @@ void bx_cpu_c::dispatch_ioreq(ioreq_t *req) if (req->dir == IOREQ_READ) { //BX_INFO(("addr:%llx, pdata:%llx, size: %x, count: %x\n", req->addr, req->u.pdata, req->size, req->count)); for (i = 0; i < req->count; i++) { - BX_MEM_READ_PHYSICAL(req->addr + (i * req->size), req->size, &tmp); - BX_MEM_WRITE_PHYSICAL((Bit32u) req->u.pdata + (i * req->size), req->size, &tmp); + BX_MEM_READ_PHYSICAL(req->addr + (sign * i * req->size), req->size, &tmp); + BX_MEM_WRITE_PHYSICAL((Bit32u) req->u.pdata + (sign * i * req->size), req->size, &tmp); } } else if (req->dir == IOREQ_WRITE) { //BX_INFO(("addr:%llx, pdata:%llx, size: %x, count: %x\n", req->addr, req->u.pdata, req->size, req->count)); for (i = 0; i < req->count; i++) { - BX_MEM_READ_PHYSICAL((Bit32u)req->u.pdata + (i * req->size), req->size, &tmp); - BX_MEM_WRITE_PHYSICAL(req->addr + (i * req->size), req->size, &tmp); + BX_MEM_READ_PHYSICAL((Bit32u)req->u.pdata + (sign * i * req->size), req->size, &tmp); + BX_MEM_WRITE_PHYSICAL(req->addr + (sign * i * req->size), req->size, &tmp); } } } -- 2.30.2